#!/usr/bin/env python
#-------------------------------python------------------------palle.py--#
#                                                                       #
#                         Palle in movimento                            #
#                                                                       #
#--Daniele Zambelli----------------------------------------------2003---#

from pycart import Plane

class Palla_sta:
  def __init__(self, piano, x=0, y=0, raggio=0, colore='black'):
    """Crea una palla dati: posizione, raggio e colore"""
    self.p=piano
    self.c=piano.getcanvas()
    self.r=raggio
    self.setbordo(x, y)
    self.o=self.c.create_oval(self.x1, self.y1, self.x2, self.y2, fill=colore)
    self.c.update()

  def setbordo(self, x, y):
    """Calcola il rettangolo che conterra' la palla"""
    self.x1, self.y1 = self.p._p2s((x-self.r, y-self.r))
    self.x2, self.y2 = self.p._p2s((x+self.r, y+self.r))
    
  def setpos(self, x, y):
    """Sposta la palla in un punto del piano"""
    self.setbordo(x, y)
    self.c.coords(self.o, self.x1, self.y1, self.x2, self.y2)
    self.c.update()
    
class Palla_cin(Palla_sta):
  def __init__(self, piano, x=0, y=0, raggio=0, colore='black',
               vx=0, vy=0):
    """Crea una palla dati: posizione, raggio, colore e velocita'"""
    Palla_sta.__init__(self, piano, x, y, raggio, colore) 
    self.vx=vx; self.vy=vy

  def muovi(self):
    """ Muove la palla delle componenti la sua velocita'"""
    self.x1+=self.vx
    self.y1+=self.vy
    self.x2+=self.vx
    self.y2+=self.vy
    self.c.coords(self.o, self.x1, self.y1, self.x2, self.y2)
    self.c.update()

  def setv(self, vx, vy):
    """Modifica le componenti della velocita' della palla"""
    self.vx= vx; self.vy=vy

class Palla_din(Palla_cin):
  def __init__(self, piano, x=0, y=0, raggio=0, colore='black',
               vx=0, vy=0, ax=0, ay=0):
    """Crea una palla dati: posizione, raggio, colore, velocita'
    e accelerazione"""
    Palla_cin.__init__(self, piano, x, y, raggio, colore, vx, vy) 
    self.ax=ax; self.ay=ay

  def muovi(self):
    """ Applica l'accelerazione poi
    muove la palla delle componenti la sua velocita'"""
    self.vx+=self.ax
    self.vy+=self.ay
    Palla_cin.muovi(self)

  def seta(self, ax, ay):
    """Modifica le componenti dell'accelerazione della palla"""
    self.ax=ax
    self.ay=ay

def test():
# Creo una piano con dimensioni 600x600
  p=Plane("Una Palla per Vittorio", 600, 600)
  
# Creo una palla statica rossa
  palla1=Palla_sta(p, raggio=20, x=-50, y=-50, colore='red')

# Salta da una parte all'altra dello schermo, dove voglio io
  p.after(1000)
  palla1.setpos(50, -50)
  p.after(1000)
  palla1.setpos(50, 50)
  p.after(1000)
  palla1.setpos(-50, 50)
  p.after(1000)

# Creo una palla cinematica blu posizionata in alto a sinistra
# e con velocita' (3, 2)
##  palla1=Palla_cin(p, raggio=20, x=-280, y=280, colore='blue',
##                   vx=3, vy=2)
  palla1=Palla_cin(p, raggio=20, x=-280, y=280, colore='blue')
  palla1.setv(3,2)

# Si muove di moto rettilineo uniforme per un tratto
  for i in range(180):
    palla1.muovi()
    p.after(1)

# Creo una palla dinamica verde posizionata in alto a sinistra
# e con velocita' iniziale (3, 0) e accelerazione (0, 1)
##  palla1=Palla_din(p, raggio=20, x=0, y=280, colore='green',
##                   vx=10, vy=0,
##                   ax=0, ay=1)
  palla1=Palla_din(p, raggio=20, x=0, y=280, colore='green')
  palla1.setv(7, 0)
  palla1.seta(0, 1)

# Cade con moto uniformemente accelerato

  p.after(1000)
  for i in range(32):
    palla1.muovi()
    p.after(10)

  p.mainloop()
if __name__ == "__main__":
   test()
